home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / drivers / ccastles.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  13KB  |  329 lines

  1. /***************************************************************************
  2.  
  3. I'm in no mood to write documentation now, so if you have any questions
  4. about this driver, please address them to Pat Lawrence <pjl@ns.net>.  I'll
  5. be happy to help you out any way I can.
  6.  
  7. Crystal Castles memory map.
  8.  
  9.  Address  A A A A A A A A A A A A A A A A  R  D D D D D D D D  Function
  10.           1 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0  /  7 6 5 4 3 2 1 0
  11.           5 4 3 2 1 0                      W
  12. -------------------------------------------------------------------------------
  13. 0000      X X X X X X X X X X X X X X X X  W  X X X X X X X X  X Coordinate
  14. 0001      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1  W  D D D D D D D D  Y Coordinate
  15. 0002      0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 R/W D D D D          Bit Mode
  16. 0003-0BFF 0 0 0 0 A A A A A A A A A A A A R/W D D D D D D D D  RAM (DRAM)
  17. 0C00-7FFF 0 A A A A A A A A A A A A A A A R/W D D D D D D D D  Screen RAM
  18. 8000-8DFF 1 0 0 0 A A A A A A A A A A A A R/W D D D D D D D D  RAM (STATIC)
  19. 8E00-8EFF 1 0 0 0 1 1 1 0 A A A A A A A A R/W D D D D D D D D  MOB BUF 2
  20. -------------------------------------------------------------------------------
  21. 8F00-8FFF 1 0 0 0 1 1 1 1 A A A A A A A A R/W D D D D D D D D  MOB BUF 1
  22.                                       0 0 R/W D D D D D D D D  MOB Picture
  23.                                       0 1 R/W D D D D D D D D  MOB Vertical
  24.                                       1 0 R/W D D D D D D D D  MOB Priority
  25.                                       1 1 R/W D D D D D D D D  MOB Horizontal
  26. -------------------------------------------------------------------------------
  27. 9000-90FF 1 0 0 1 0 0 X X A A A A A A A A R/W D D D D D D D D  NOVRAM
  28. 9400-9401 1 0 0 1 0 1 0 X X X X X X X 0 A  R                   TRAK-BALL 1
  29. 9402-9403 1 0 0 1 0 1 0 X X X X X X X 1 A  R                   TRAK-BALL 2
  30. 9500-9501 1 0 0 1 0 1 0 X X X X X X X X A  R                   TRAK-BALL 1 mirror
  31. 9600      1 0 0 1 0 1 1 X X X X X X X X X  R                   IN0
  32.                                            R                D  COIN R
  33.                                            R              D    COIN L
  34.                                            R            D      COIN AUX
  35.                                            R          D        SLAM
  36.                                            R        D          SELF TEST
  37.                                            R      D            VBLANK
  38.                                            R    D              JMP1
  39.                                            R  D                JMP2
  40. -------------------------------------------------------------------------------
  41. 9800-980F 1 0 0 1 1 0 0 X X X X X A A A A R/W D D D D D D D D  CI/O 0
  42. 9A00-9A0F 1 0 0 1 1 0 1 X X X X X A A A A R/W D D D D D D D D  CI/O 1
  43. 9A08                                                    D D D  Option SW
  44.                                                       D        SPARE
  45.                                                     D          SPARE
  46.                                                   D            SPARE
  47. 9C00      1 0 0 1 1 1 0 0 0 X X X X X X X  W                   RECALL
  48. -------------------------------------------------------------------------------
  49. 9C80      1 0 0 1 1 1 0 0 1 X X X X X X X  W  D D D D D D D D  H Scr Ctr Load
  50. 9D00      1 0 0 1 1 1 0 1 0 X X X X X X X  W  D D D D D D D D  V Scr Ctr Load
  51. 9D80      1 0 0 1 1 1 0 1 1 X X X X X X X  W                   Int. Acknowledge
  52. 9E00      1 0 0 1 1 1 1 0 0 X X X X X X X  W                   WDOG
  53.           1 0 0 1 1 1 1 0 1 X X X X A A A  W                D  OUT0
  54. 9E80                                0 0 0  W                D  Trak Ball Light P1
  55. 9E81                                0 0 1  W                D  Trak Ball Light P2
  56. 9E82                                0 1 0  W                D  Store Low
  57. 9E83                                0 1 1  W                D  Store High
  58. 9E84                                1 0 0  W                D  Spare
  59. 9E85                                1 0 1  W                D  Coin Counter R
  60. 9E86                                1 1 0  W                D  Coin Counter L
  61. 9E87                                1 1 1  W                D  BANK0-BANK1
  62.           1 0 0 1 1 1 1 1 0 X X X X A A A  W          D        OUT1
  63. 9F00                                0 0 0  W          D        ^AX
  64. 9F01                                0 0 1  W          D        ^AY
  65. 9F02                                0 1 0  W          D        ^XINC
  66. 9F03                                0 1 1  W          D        ^YINC
  67. 9F04                                1 0 0  W          D        PLAYER2 (flip screen)
  68. 9F05                                1 0 1  W          D        ^SIRE
  69. 9F06                                1 1 0  W          D        BOTHRAM
  70. 9F07                                1 1 1  W          D        BUF1/^BUF2 (sprite bank)
  71. 9F80-9FBF 1 0 0 1 1 1 1 1 1 X A A A A A A  W  D D D D D D D D  COLORAM
  72. A000-FFFF 1 A A A A A A A A A A A A A A A  R  D D D D D D D D  Program ROM
  73.  
  74. ***************************************************************************/
  75.  
  76. #include "driver.h"
  77. #include "vidhrdw/generic.h"
  78.  
  79.  
  80.  
  81. extern unsigned char *ccastles_screen_addr;
  82. extern unsigned char *ccastles_screen_inc;
  83. extern unsigned char *ccastles_screen_inc_enable;
  84. extern unsigned char *ccastles_sprite_bank;
  85. extern unsigned char *ccastles_scrollx;
  86. extern unsigned char *ccastles_scrolly;
  87.  
  88. WRITE_HANDLER( ccastles_paletteram_w );
  89. int ccastles_vh_start(void);
  90. void ccastles_vh_stop(void);
  91. void ccastles_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
  92.  
  93. READ_HANDLER( ccastles_bitmode_r );
  94. WRITE_HANDLER( ccastles_bitmode_w );
  95.  
  96. WRITE_HANDLER( ccastles_flipscreen_w );
  97.  
  98.  
  99. static unsigned char *nvram;
  100. static size_t nvram_size;
  101.  
  102. static void nvram_handler(void *file,int read_or_write)
  103. {
  104.     if (read_or_write)
  105.         osd_fwrite(file,nvram,nvram_size);
  106.     else
  107.     {
  108.         if (file)
  109.             osd_fread(file,nvram,nvram_size);
  110.         else
  111.             memset(nvram,0,nvram_size);
  112.     }
  113. }
  114.  
  115.  
  116. static WRITE_HANDLER( ccastles_led_w )
  117. {
  118.     osd_led_w(offset,~data);
  119. }
  120.  
  121. static WRITE_HANDLER( ccastles_coin_counter_w )
  122. {
  123.     /* this is not working, haven't investigated why */
  124.     coin_counter_w(offset^1, ~data);
  125. }
  126.  
  127. static WRITE_HANDLER( ccastles_bankswitch_w )
  128. {
  129.     unsigned char *RAM = memory_region(REGION_CPU1);
  130.  
  131.  
  132.     if (data) { cpu_setbank(1,&RAM[0x10000]); }
  133.     else { cpu_setbank(1,&RAM[0xa000]); }
  134. }
  135.  
  136. static struct MemoryReadAddress readmem[] =
  137. {
  138.     { 0x0002, 0x0002, ccastles_bitmode_r },
  139.     { 0x0000, 0x8fff, MRA_RAM },
  140.     { 0x9000, 0x90ff, MRA_RAM },
  141.     { 0x9400, 0x9400, input_port_2_r },    /* trackball y - player 1 */
  142.     { 0x9402, 0x9402, input_port_2_r },    /* trackball y - player 2 */
  143.     { 0x9500, 0x9500, input_port_2_r },    /* trackball y - player 1 mirror */
  144.     { 0x9401, 0x9401, input_port_3_r },    /* trackball x - player 1 */
  145.     { 0x9403, 0x9403, input_port_3_r },    /* trackball x - player 2 */
  146.     { 0x9501, 0x9501, input_port_3_r },    /* trackball x - player 1 mirror */
  147.     { 0x9600, 0x9600, input_port_0_r },    /* IN0 */
  148.     { 0x9800, 0x980f, pokey1_r }, /* Random # generator on a Pokey */
  149.     { 0x9a00, 0x9a0f, pokey2_r }, /* Random #, IN1 */
  150.     { 0xa000, 0xdfff, MRA_BANK1 },
  151.     { 0xe000, 0xffff, MRA_ROM },    /* ROMs/interrupt vectors */
  152.     { -1 }    /* end of table */
  153. };
  154.  
  155. static struct MemoryWriteAddress writemem[] =
  156. {
  157.     { 0x0000, 0x0001, MWA_RAM, &ccastles_screen_addr },
  158.     { 0x0002, 0x0002, ccastles_bitmode_w },
  159.     { 0x0003, 0x0bff, MWA_RAM },
  160.     { 0x0c00, 0x7fff, MWA_RAM, &videoram },
  161.     { 0x8000, 0x8dff, MWA_RAM },
  162.     { 0x8e00, 0x8eff, MWA_RAM, &spriteram_2, &spriteram_size },
  163.     { 0x8f00, 0x8fff, MWA_RAM, &spriteram },
  164.     { 0x9000, 0x90ff, MWA_RAM, &nvram, &nvram_size },
  165.     { 0x9800, 0x980f, pokey1_w },
  166.     { 0x9a00, 0x9a0f, pokey2_w },
  167.     { 0x9c80, 0x9c80, MWA_RAM, &ccastles_scrollx },
  168.     { 0x9d00, 0x9d00, MWA_RAM, &ccastles_scrolly },
  169.     { 0x9d80, 0x9d80, MWA_NOP },
  170.     { 0x9e00, 0x9e00, watchdog_reset_w },
  171.     { 0x9e80, 0x9e81, ccastles_led_w },
  172.     { 0x9e85, 0x9e86, ccastles_coin_counter_w },
  173.     { 0x9e87, 0x9e87, ccastles_bankswitch_w },
  174.     { 0x9f00, 0x9f01, MWA_RAM, &ccastles_screen_inc_enable },
  175.     { 0x9f02, 0x9f03, MWA_RAM, &ccastles_screen_inc },
  176.     { 0x9f04, 0x9f04, ccastles_flipscreen_w },
  177.     { 0x9f05, 0x9f06, MWA_RAM },
  178.     { 0x9f07, 0x9f07, MWA_RAM, &ccastles_sprite_bank },
  179.     { 0x9f80, 0x9fbf, ccastles_paletteram_w },
  180.     { 0xa000, 0xffff, MWA_ROM },
  181.     { -1 }    /* end of table */
  182. };
  183.  
  184. INPUT_PORTS_START( ccastles )
  185.     PORT_START    /* IN0 */
  186.     PORT_BIT ( 0x01, IP_ACTIVE_LOW, IPT_COIN2 )
  187.     PORT_BIT ( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )
  188.     PORT_BIT ( 0x04, IP_ACTIVE_LOW, IPT_COIN3 )
  189.     PORT_BIT ( 0x08, IP_ACTIVE_LOW, IPT_TILT )
  190.     PORT_SERVICE( 0x10, IP_ACTIVE_LOW )
  191.     PORT_BIT ( 0x20, IP_ACTIVE_HIGH, IPT_VBLANK )
  192.     PORT_BIT ( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 )                /* 1p Jump, non-cocktail start1 */
  193.     PORT_BIT ( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 ) /* 2p Jump, non-cocktail start2 */
  194.  
  195.     PORT_START    /* IN1 */
  196.     PORT_BIT ( 0x07, IP_ACTIVE_LOW, IPT_UNKNOWN )
  197.     PORT_BIT ( 0x08, IP_ACTIVE_LOW, IPT_START1 )                /* cocktail only */
  198.     PORT_BIT ( 0x10, IP_ACTIVE_LOW, IPT_START2 )                /* cocktail only */
  199.     PORT_DIPNAME(0x20, 0x00, DEF_STR( Cabinet ) )
  200.     PORT_DIPSETTING (   0x00, DEF_STR( Upright ) )
  201.     PORT_DIPSETTING (   0x20, DEF_STR( Cocktail ) )
  202.     PORT_BIT ( 0xc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
  203.  
  204.     PORT_START    /* IN2 */
  205.     PORT_ANALOG( 0xff, 0x7f, IPT_TRACKBALL_Y | IPF_REVERSE, 10, 30, 0, 0 )
  206.  
  207.     PORT_START    /* IN3 */
  208.     PORT_ANALOG( 0xff, 0x7f, IPT_TRACKBALL_X, 10, 30, 0, 0 )
  209. INPUT_PORTS_END
  210.  
  211. static struct GfxLayout ccastles_spritelayout =
  212. {
  213.     8,16,    /* 8*16 sprites */
  214.     256,    /* 256 sprites */
  215.     4,    /* 4 bits per pixel (the most significant bit is always 0) */
  216.     { 0x2000*8+0, 0x2000*8+4, 0, 4 },    /* the three bitplanes are separated */
  217.     { 0, 1, 2, 3, 8+0, 8+1, 8+2, 8+3 },
  218.     { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
  219.             8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 },
  220.     32*8    /* every sprite takes 32 consecutive bytes */
  221. };
  222.  
  223.  
  224. static struct GfxDecodeInfo gfxdecodeinfo[] =
  225. {
  226.     { REGION_GFX1, 0x0000, &ccastles_spritelayout,  0, 1 },
  227.     { -1 } /* end of array */
  228. };
  229.  
  230.  
  231.  
  232.  
  233. static struct POKEYinterface pokey_interface =
  234. {
  235.     2,    /* 2 chips */
  236.     1250000,    /* 1.25 MHz??? */
  237.     { 50, 50 },
  238.     /* The 8 pot handlers */
  239.     { 0, 0 },
  240.     { 0, 0 },
  241.     { 0, 0 },
  242.     { 0, 0 },
  243.     { 0, 0 },
  244.     { 0, 0 },
  245.     { 0, 0 },
  246.     { 0, 0 },
  247.     /* The allpot handler */
  248.     { 0, input_port_1_r },
  249. };
  250.  
  251.  
  252.  
  253. static struct MachineDriver machine_driver_ccastles =
  254. {
  255.     /* basic machine hardware */
  256.     {
  257.         {
  258.             CPU_M6502,
  259.             1500000,    /* 1.5 Mhz */
  260.             readmem,writemem,0,0,
  261.             interrupt,4
  262.         }
  263.     },
  264.     60, DEFAULT_REAL_60HZ_VBLANK_DURATION,    /* frames per second, vblank duration */
  265.     1,    /* single CPU, no need for interleaving */
  266.  
  267.     0,
  268.     256, 232, { 0, 255, 0, 231 },
  269.     gfxdecodeinfo,
  270.     32, 32,
  271.     0,
  272.  
  273.     VIDEO_TYPE_RASTER|VIDEO_MODIFIES_PALETTE,
  274.     0,
  275.     ccastles_vh_start,
  276.     ccastles_vh_stop,
  277.     ccastles_vh_screenrefresh,
  278.  
  279.     /* sound hardware */
  280.     0,0,0,0,
  281.     {
  282.         {
  283.             SOUND_POKEY,
  284.             &pokey_interface
  285.         }
  286.     },
  287.  
  288.     nvram_handler
  289. };
  290.  
  291.  
  292.  
  293. /***************************************************************************
  294.  
  295.   Game driver(s)
  296.  
  297. ***************************************************************************/
  298.  
  299. ROM_START( ccastles )
  300.      ROM_REGION( 0x14000, REGION_CPU1 )    /* 64k for code */
  301.      ROM_LOAD( "ccastles.303", 0x0a000, 0x2000, 0x10e39fce )
  302.      ROM_LOAD( "ccastles.304", 0x0c000, 0x2000, 0x74510f72 )
  303.      ROM_LOAD( "ccastles.305", 0x0e000, 0x2000, 0x9418cf8a )
  304.      ROM_LOAD( "ccastles.102", 0x10000, 0x2000, 0xf6ccfbd4 )    /* Bank switched ROMs */
  305.      ROM_LOAD( "ccastles.101", 0x12000, 0x2000, 0xe2e17236 )    /* containing level data. */
  306.  
  307.      ROM_REGION( 0x4000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  308.      ROM_LOAD( "ccastles.107", 0x0000, 0x2000, 0x39960b7d )
  309.      ROM_LOAD( "ccastles.106", 0x2000, 0x2000, 0x9d1d89fc )
  310. ROM_END
  311.  
  312. ROM_START( ccastle2 )
  313.      ROM_REGION( 0x14000, REGION_CPU1 )    /* 64k for code */
  314.      ROM_LOAD( "ccastles.203", 0x0a000, 0x2000, 0x348a96f0 )
  315.      ROM_LOAD( "ccastles.204", 0x0c000, 0x2000, 0xd48d8c1f )
  316.      ROM_LOAD( "ccastles.205", 0x0e000, 0x2000, 0x0e4883cc )
  317.      ROM_LOAD( "ccastles.102", 0x10000, 0x2000, 0xf6ccfbd4 )    /* Bank switched ROMs */
  318.      ROM_LOAD( "ccastles.101", 0x12000, 0x2000, 0xe2e17236 )    /* containing level data. */
  319.  
  320.      ROM_REGION( 0x4000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  321.      ROM_LOAD( "ccastles.107", 0x0000, 0x2000, 0x39960b7d )
  322.      ROM_LOAD( "ccastles.106", 0x2000, 0x2000, 0x9d1d89fc )
  323. ROM_END
  324.  
  325.  
  326.  
  327. GAME( 1983, ccastles, 0,        ccastles, ccastles, 0, ROT0, "Atari", "Crystal Castles (set 1)" )
  328. GAME( 1983, ccastle2, ccastles, ccastles, ccastles, 0, ROT0, "Atari", "Crystal Castles (set 2)" )
  329.